<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

include_once('ExceptionDAO.php');
include_once 'util/MapError.php';

/**
 * DAO para operações de banco para autor
 * @author Douglas Rafael
 *
 */
class DAOAutor extends CI_Model {

    /**
     * Método para <b>Listar</b> todos os autores cadastrados.
     * @return array TOAutor
     */
    public function get_all($init, $quant) {
        try {
            $this->db->order_by("id", "asc");
            $result = $this->db->get('autor', $quant, $init);

            $autores = array();
            if ($result) {
                foreach ($result->result() as $value) {
                    $autor = new TOAutor();
                    $autor->codigo = $value->id;
                    $autor->nome = $value->nome;
                    array_push($autores, $autor);
                }
            }
            return $autores;
        } catch (Exception $erro) {
            throw new ExceptionDAO('Não foi possível obter lista de autores');
        }
    }

    /**
     * Retorna o Total de registros da tabela autor.
     * @return string total de resgistros
     */
    public function quant_all() {
        return $this->db->count_all_results('autor');
    }

    /**
     * Método para <b>Inserir</b> autor.
     * @param TOAutor $autor
     * @throws ExceptionDAO 
     */
    public function insert(TOAutor $autor) {
        try {
            $this->db->set('nome', $autor->nome);
            $result = $this->db->insert('autor');
            
            if(!$result){
                throw new Exception();
            }
        } catch (Exception $e) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $autor->nome));
        }
    }

    /**
     * Método para <b>Atualizar</b> dados do autor.
     * @param TOAutor $autor 
     */
    public function update(TOAutor $autor) {
        try {
            $this->db->set('nome', $autor->nome);
            $this->db->where('id', $autor->codigo);
            $result = $this->db->update('autor');

            if (!$result) {
                throw new Exception();
            }
        } catch (Exception $e) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $autor->nome));
        }
    }

    /**
     * Método para <b>Excluir</b> autor de acordo com o código.
     * @param TOAutor $autor
     * @throws ExceptionDAO 
     */
    public function delete(TOAutor $autor) {
        try {
            $this->db->where_in('id', $autor->codigo);
            $result = $this->db->delete('autor');

            if (!$result) {
                throw new Exception();
            }
        } catch (Exception $e) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $autor->nome));
        }
    }

    /**
     * Método para <b>Buscar</b> autor
     * @param type $init
     * @param type $quant
     * @param type $term
     * @return array
     * @throws ExceptionDAO 
     */
    public function search($init, $quant, $term) {
        try {
            $this->db->like('id', $term);
            $this->db->or_like('nome', $term);
            $this->db->order_by("id", "asc");
            $result = $this->db->get('autor', $quant, $init);

            if ($result) {
                $autores = array();
                foreach ($result->result() as $value) {
                    $autor = new TOAutor();
                    $autor->codigo = $value->id;
                    $autor->nome = $value->nome;
                    array_push($autores, $autor);
                }
            } else {
                throw new Exception();
            }
            return $autores;
        } catch (Exception $e) {
            throw new ExceptionDAO( 'Erro ao tentar buscar autor - ' . $this->db->_error_message() );
        }
    }

    public function quant_search($term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);

        return $this->db->count_all_results('autor');
    }
    
     

}